package main

import "sync"

// Visited tracks whether web pages have been visited.
// Its methods may be used concurrently with one another.
type Visited struct {
	// mu guards the visited map.
	// 互斥锁定义在被保护的变量之上
	mu      sync.Mutex
	visited map[string]int
}

// VisitLink tracks that the page with the given URL has
// been visited, and returns the updated link count.
func (v *Visited) VisitLink(url string) int {
	v.mu.Lock()
	defer v.mu.Unlock()
	// 返回目前正在访问的数量
	count := v.visited[url]
	count++
	// 更新目前正在访问的数量，并返回
	v.visited[url] = count
	return count
}

// 互斥锁定义在被保护的变量之上
// 互斥锁的隐患
// 死锁
// 为保证互斥锁的安全使用，我们须遵守以下规则：
// 尽可能的简化互斥锁保护的代码
// 对每一份共享状态只使用一个互斥锁
func main() {

}
